package org.springframework.util;

import org.springframework.lang.Nullable;

public class ClassUtils {

    /**
     * 获取默认的类加载器
     * @return
     */
    @Nullable
    public static ClassLoader getDefaultClassLoader() {
        ClassLoader cl = null;
        try {
            cl = Thread.currentThread().getContextClassLoader();
        }
        catch (Throwable ex) {
            // Cannot access thread context ClassLoader - falling back...
        }
        if (cl == null) {
            // No thread context class loader -> use class loader of this class.
            cl = ClassUtils.class.getClassLoader();
            if (cl == null) {
                // getClassLoader() returning null indicates the bootstrap ClassLoader
                try {
                    cl = ClassLoader.getSystemClassLoader();
                }
                catch (Throwable ex) {
                    // Cannot access system ClassLoader - oh well, maybe the caller can live with null...
                }
            }
        }
        return cl;
    }

    /**
     * 确定由提供的名称标识的类是否存在并且可以加载。如果类或其依赖项之一不存在或无法加载，将返回false。
     * 参数：
     * className–要检查classLoader的类的名称–要使用的类加载器（可能为null，表示默认的类加载器）
     * 返回：
     * 指定的类是否存在（包括其所有超类和接口）
     * 抛出异常：
     * IllegalStateException-如果相应的类是可解析的，但类的继承层次结构中存在可读性不匹配（通常是Jigsaw模块定义中缺少依赖声明，用于在此处检查由类实现的超类或接口）
     * @param className
     * @return
     */
    public static boolean isPresent(String className) {
        try {
            Class.forName(className);
            return true;
        }
        catch (IllegalAccessError err) {
            throw new IllegalStateException("Readability mismatch in inheritance hierarchy of class [" +
                    className + "]: " + err.getMessage(), err);
        }
        catch (Throwable ex) {
            return false;
        }
    }
}
